using DemoContentLoader;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.IO;
using System.Runtime.CompilerServices;

namespace DemoContentBuilder
{
    public static class Texture2DBuilder
    {
        public unsafe static Texture2DContent Build(Stream dataStream)
        {
            using (var rawImage = SixLabors.ImageSharp.Image.Load(dataStream))
            using (var image = rawImage.CloneAs<Rgba32>())
            {
                var pixels = image.GetPixelSpan();
                var imageData = new int[pixels.Length];
                fixed (int* imageDataPointer = imageData)
                {
                    var casted = new Span<Rgba32>(imageDataPointer, imageData.Length);
                    pixels.CopyTo(casted);
                }
                // 我们目前只支持R8G8B8A8,因此以字节为单位的纹理元素大小始终为4。
                // 我们在内容时间不计算MIPS。我们可以,但是..。没有太多理由这样做。
                // 字体生成器之所以这样做,是因为它使用了非标准的MIP过程,但该生成器预计将用于处理普通数据。
                var content = new Texture2DContent(image.Width, image.Height, 1, sizeof(Rgba32));
                var data = (Rgba32*)content.Pin();
                // 将图像数据复制到Texture2DContent中。
                for (int rowIndex = 0; rowIndex < image.Height; ++rowIndex)
                {
                    var sourceRow = image.GetPixelRowSpan(rowIndex);
                    var targetRow = data + content.GetRowOffsetForMip0(rowIndex);
                    Unsafe.CopyBlockUnaligned(ref *(byte*)targetRow, ref Unsafe.As<Rgba32, byte>(ref sourceRow[0]), (uint)(sizeof(Rgba32) * image.Width));
                }
                content.Unpin();
                return content;
            }
        }
    }
}
